package com.ipartek.formacion.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import com.ipartek.formacion.bean.Alumno;
import com.ipartek.formacion.interfaces.InterfaceTiradaDAO;

/**
 * Clase para el manejo de las operaciones contra la tabla tirada
 * 
 * @author Jonatan
 */
public class MySqlTiradaDAO implements InterfaceTiradaDAO {

	// Variables log
	private static final Logger log = Logger.getLogger(MySqlTiradaDAO.class);
	private static final String LOG4J_PROPERTIES = "config/log4j.properties";

	// constantes para los nombres de las tablas a utilizar en la SQL
	private static final String TABLA_ALUMNO = "alumno";
	private static final String TABLA_TIRADA = "tirada";

	// ***********************//
	// ****** CONTRUCTOR *****//
	// ***********************//
	public MySqlTiradaDAO() {
		PropertyConfigurator.configure(LOG4J_PROPERTIES);
	}

	// ***********************//
	// ******* METODOS *******//
	// ***********************//
	/**
	 * Recupera el ranking de alumnos ordenador por numero de tiradas de mayor a
	 * menor y por fecha de mayor a menor
	 */
	@Override
	public ArrayList<Alumno> getHistorialTiradas() throws Exception {
		ArrayList<Alumno> listaAlumnos = new ArrayList<Alumno>();
		Connection conexion = null;
		String sql = null;

		sql = "select a.nombre,a.apellido1,a.apellido2,a.dni,t.fecha "
				+ "from " + TABLA_ALUMNO + " a, " + TABLA_TIRADA + " t "
				+ "where a.fecha_baja is null and " + "a.id = t.alumno_id "
				+ "order by t.fecha ";

		log.info("Se ejecuta la SQL : " + sql);

		try {
			// Se establece la conexion con la BD
			conexion = MySqlDAOFactory.conectar();

			PreparedStatement stmt = conexion.prepareStatement(sql);

			// Se ejecuta la query
			ResultSet resultadoquery = stmt.executeQuery();

			// Se recorre la lista de alumnos
			while (resultadoquery.next()) {
				Alumno alumno = new Alumno();

				alumno.setNombre(resultadoquery.getString("nombre"));
				alumno.setApellido1(resultadoquery.getString("apellido1"));
				alumno.setApellido2(resultadoquery.getString("apellido2"));
				alumno.setDNI(resultadoquery.getString("dni"));
				alumno.setFechaModificacion(resultadoquery
						.getTimestamp("fecha"));
				listaAlumnos.add(alumno);
			}
		} catch (SQLException ex) {
			SQLException e = ex;
			while (ex != null) {
				log.error("MySqlTiradaDAO.getRankingGlobal() Message: "
						+ ex.getMessage() + "SQLState: " + ex.getSQLState()
						+ "ErrorCode: " + ex.getErrorCode());
				ex = ex.getNextException();
			}
			throw e;
		} catch (Exception ex) {
			log.error("Se ha producido una excepcion en MySqlTiradaDAO.getRankingGlobal()"
					+ ex.getMessage());
			throw ex;
		} finally {
			// Se cierra la conexion con la BD
			MySqlDAOFactory.desconectar(conexion);
		}

		return listaAlumnos;
	}

	/**
	 * Inserta una tirada en la tabla tirada con la fecha del momento de la
	 * insercion y el alumno_id del alumno que reciba por parametro
	 */
	@Override
	public boolean addTirada(Alumno alumno) throws Exception {

		boolean resultado = false;
		Connection conexion = null;
		String sql = null;

		sql = "INSERT INTO " + TABLA_TIRADA
				+ " (fecha, alumno_id) VALUES (CURRENT_TIMESTAMP,?)";

		log.info("Se ejecuta la SQL : " + sql);

		try {
			conexion = MySqlDAOFactory.conectar();
			PreparedStatement stmt = conexion.prepareStatement(sql);

			stmt.setInt(1, alumno.getId());
			stmt.executeUpdate();

			resultado = true;
		} catch (SQLException ex) {
			SQLException e = ex;
			while (ex != null) {
				log.error("MySqlTiradaDAO.addTirada() Message: "
						+ ex.getMessage() + "SQLState: " + ex.getSQLState()
						+ "ErrorCode: " + ex.getErrorCode());
				ex = ex.getNextException();
			}
			throw e;
		} catch (Exception ex) {
			log.error("Se ha producido una excepcion en MySqlAlumnoDAO.getAlumnos()"
					+ ex.getMessage());
			throw ex;
		} finally {
			MySqlDAOFactory.desconectar(conexion);
		}
		return resultado;
	}

	/**
	 * Devuelve el ranking de un dia concreto
	 */
	@Override
	public ArrayList<Alumno> getRankingDiaX() {
		// TODO Auto-generated method stub
		// select * from dado.tirada where fecha like'2013-12-04%'
		return null;
	}

}
